package com.base.util.javautils.app;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.base.util.javautils.log.ILogPrinter;
import com.base.util.javautils.log.LogUtil;
import com.base.util.javautils.view.ViewInjector;

/**
 * 项目中所有需要处理重入逻辑的Activity的基类
 * Created by gj on 16-1-20.
 */
abstract public class AbstractActivity extends AppCompatActivity {

    private final ILogPrinter mLogPrinter = LogUtil.createLogPrinter(getClass());

    /**
     * 这个函数主要负责初始化页面，获得页面对象等操作在这里
     * 这个函数执行完，要保证静态页面的对象和初始化状态都是有效的
     * 这个函数在重入时不会调用，动态数据和动态加载的页面不要在这个函数中处理
     */
    protected void initStaticView() {
        ViewInjector.inject(this);
    }

    /**
     * 在{#initData} 前调用，初始化组件和需要在最开始做的操作在这里
     * 这个函数是生命周期的最初入口，不论是正常启动还是重入
     * 这个函数会在Activity生命周期函数的super函数调用之前调用
     */
    abstract protected void init();

    /**
     * 需要在初始化页面前准备好的数据在这里初始化
     * 这个函数主要用来辅助Activity重入或者横竖平切换时刷新页面数据的需求，所以最好只将和重入等有关的逻辑放在这里
     */
    abstract protected void initData(Intent intent);

    /**
     * 调用这个函数时，页面对象已经全部初始化完成，静态数据和组件已经全部准备好，需要在这里刷新页面的数据和请求动态数据
     * 这个函数最好只用来做跟外部数据有关的或者需要在重入时初始化的页面操作
     * 这个函数主要用来辅助Activity重入或者横竖平切换时刷新页面数据的需求，所以最好只将和重入等有关的逻辑放在这里
     */
    abstract protected void startup();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        init();
        super.onCreate(savedInstanceState);
        mLogPrinter.flag();
        initData(getIntent());
        initStaticView();
        startup();
        AppCore.cast(this).setCurrentActivity(this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        init();
        super.onNewIntent(intent);
        mLogPrinter.flag();
        initData(intent);
        startup();
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mLogPrinter.flag();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mLogPrinter.flag();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mLogPrinter.flag();
        AppCore.cast(this).setCurrentActivity(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mLogPrinter.flag();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mLogPrinter.flag();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLogPrinter.flag();
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        mLogPrinter.flag();
    }

    @Override
    public void finish() {
        super.finish();
        mLogPrinter.flag();
    }

    protected ILogPrinter getLogger() {
        return mLogPrinter;
    }
}
